package com.zsh.dao.impl;

import com.zsh.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import javax.management.Query;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public abstract class BaseDao {
    //使用DbUtils操作数据库
    private QueryRunner queryRunner = new QueryRunner();

    /**
     * update() 方法用来执行，insert,update,delete语句
     * @return 如果返回-1，则失败，反之返回其他表示影响行数
     */
    public int update(String sql,Object ... args){
        Connection coon = JdbcUtils.getConnection();

        try {
            return queryRunner.update(coon,sql,args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 查询返回一个javaBean的sql语句
     * @param type 返回对象的类型
     * @param sql 查询语句
     * @param args sql对应的参数
     * @param <T> 返回的类型的泛型
     * @return
     */
    public <T> T  queryForOne(Class<T> type,String sql,Object ... args){
        Connection coon = JdbcUtils.getConnection();
        try {
           return queryRunner.query(coon,sql,new BeanHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 查询返回多个javaBean的sql语句
     * @param type 返回对象的类型
     * @param sql 查询语句
     * @param args sql对应的参数
     * @param <T> 返回的类型的泛型
     * @return
     */
//    public <T> List<T> queryForList(Class<T> type, String sql, Object ... args){
//        Connection coon = JdbcUtils.getConnection();
//        try {
//            return (List<T>) queryRunner.query(coon,sql,new BeanHandler<T>(type),args);
//        } catch (SQLException e) {
//            e.printStackTrace();
//        } finally {
//            JdbcUtils.close(coon);
//        }
//        return null;
//    }
    public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {
        Connection con = JdbcUtils.getConnection();
        try {
            return queryRunner.query(con, sql, new BeanListHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }

    /**
     * 查询返回一行一列的sql语句
     * @param sql  执行的sql语句
     * @param args sql对应的参数
     * @return
     */
    public Object queryForSingleValue(String sql, Object ... args){
        Connection coon = JdbcUtils.getConnection();

        try {
            return queryRunner.query(coon,sql,new ScalarHandler(),args);
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }









}
